#include <bits/stdc++.h>
using namespace std;
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, m;
    scanf("%d%d", &n, &m);
    int game[n][2], target[n];
    for(int i = 0; i < n; i++) scanf("%d", target + i);
    for(int i = 0; i < n; i++){
        scanf("%d%d", &game[i][0], &game[i][1]);
    }
    //枚举(二进制数表示每局是否选困难)
    int res = 0;
    for(int i = 0; i < (1<<n); i++){
        int cnt = 0;
        for(int j = 0; j < n; j++){
            if(i>>j&1)
                cnt++;
        }
        if(cnt <= m){//合法选择
            //优先队列
            priority_queue<int> q;
            //每局所得分数
            for(int j = 0; j < n; j++){
                if(i>>j&1)
                    q.push(game[j][1]);
                else
                    q.push(game[j][0]);
            }
            int sum = 0, winCnt = 0;
            for(int j = 0; j < n; j++){
                //总是优先选择分值较大的一局
                sum += q.top();
                q.pop();
                //大于等于规定分数
                if(sum >= target[j])
                    winCnt++;
            }
            //能赢的最大次数
            res = max(res, winCnt);
        }
    }
    printf("%d", res);
	return 0;
}

/*

小A是一个游戏天才，他在游戏中几乎不会输，但在这样一款游戏中，他即使打败了所有对手，也无法获得全部的胜利。

这是一个有n关的闯关游戏，每一关结束后有一个目标分数targeti，若结束时所得分数大于等于目标分数，则算胜利一次。

每关游戏有两个等级：简单和困难，通过不同难度的模式，会获得不同的分数，初始默认是n关都是简单的游戏，

但是小A为了能获得更多次的胜利，他可以将不超过m关的难度提升为困难，

这样他可以得到更多的分（因为小A是个游戏天才，所以他一定会过关，获得相应分数），

并且他可以自由的决定关卡的挑战顺序。

如何合理地重新排列数组的关卡的挑战顺序（也可以保持不变），
并合理使用不超过m次提升难度的次数，能让你帮小A获得最多次的胜利，请你算小A算算他最多可以获得多少次胜利。

输入格式
第一行包含两个数n和m，n代表有多少个数，m代表难度提升的次数。

第二行包含n个数，第i个数代表第i论的目标分数targeti。

接下来n行，每行分别是一个aj（简单难度的分数），一个bj（困难难度的分数）。
输出格式
一个值，小A最多的获胜次数。

数据范围
1 ≤ m≤ n≤ 15,≤ 100000

-100000 ≤ targeti ≤ 100000

-100 ≤ aj,bj≤ 100

输入数据
3 1
5 7 9
1 1
2 3
2 5

输出数据
2

*/
